home *** CD-ROM | disk | FTP | other *** search
- (*===========================================================================*)
- (* Timer service routines *)
- (* *)
- (* Copyright 1988, 1989, 1990 by H. Roy Engehausen. All rights reserved. *)
- (* *)
- (*===========================================================================*)
-
- (*===========================================================================*)
- (* There are two timers: *)
- (* 1. Todays/date time. *)
- (* Format is in ticks since Jan 1, 1980. One tick = 2 seconds *)
- (* 2. Uptime *)
- (* Format is in ticks since MIDNIGHT the day the BBS was started *)
- (* One tick = .01 seconds *)
- (*===========================================================================*)
-
- UNIT BBTIME;
-
- INTERFACE
-
- USES
- DOS;
-
- PROCEDURE time_check;
- PROCEDURE new_date;
- FUNCTION time_str (in_time : LONGINT; year_sw : BOOLEAN) : STRING;
- FUNCTION time_next_hour(min_hour: WORD) : LONGINT;
- PROCEDURE unconvert_time(in_t : LONGINT; VAR out_s : DATETIME);
- PROCEDURE convert_time (in_s : DATETIME; VAR out_t : LONGINT);
- FUNCTION time_from_now (secs : WORD) : LONGINT;
- FUNCTION up_time_from_now (secs : WORD) : LONGINT;
- FUNCTION time_unstr (in_time : STRING; VAR err : BOOLEAN) : LONGINT;
- PROCEDURE get_up_time;
- PROCEDURE calc_up_time;
-
- (*===========================================================================*)
- (* Global constants for all timers *)
- (*===========================================================================*)
-
- {$I BBTIMEC.PAS}
-
- (*===========================================================================*)
- (* Global variables *)
- (*===========================================================================*)
-
- VAR
- last_min : WORD;
- last_hours : WORD;
-
- IMPLEMENTATION
-
- USES
- bbdummy,
- bbstr;
-
- (*===========================================================================*)
- (* Global variables but local to unit *)
- (*===========================================================================*)
-
- VAR
-
- work_str : STRING[4];
-
- (*===========================================================================*)
- (* Forwards *)
- (*===========================================================================*)
-
- PROCEDURE new_time; FORWARD;
-
- (*===========================================================================*)
- (* Convert time from LONGINT to Turbo's structure *)
- (*===========================================================================*)
-
- PROCEDURE unconvert_time(in_t : LONGINT; VAR out_s : DATETIME);
-
- VAR
- i : BYTE;
- j : BYTE;
- leap : BYTE;
- w : WORD;
-
- BEGIN;
- WITH out_s DO
- BEGIN;
-
- IF in_t < 0 THEN in_t := 0;
-
- sec := (in_t MOD 30) SHL secs_per_tick_shift;
- in_t := in_t DIV 30;
-
- min := in_t MOD 60;
- in_t := in_t DIV 60;
-
- hour := in_t MOD 24;
- in_t := in_t DIV 24;
-
- leap := in_t DIV days_per_4year;
- w := in_t MOD days_per_4year;
-
- i := w DIV 365;
- IF i > 3 THEN
- i := 3;
- year := 1981 + 4 * leap + i;
- w := w + 1 - i * 365;
- j := 1;
- IF i <> 3 THEN
- BEGIN;
- WHILE (j <= 11) AND (w > y_noleap[j+1]) DO
- INC(j);
- day := w - y_noleap[j];
- END
- ELSE
- BEGIN;
- WHILE (j <= 11) AND (w > y_leap[j+1]) DO
- INC(j);
- day := w - y_leap[j];
- END;
- month := j;
- END;
- END;
-
- (*===========================================================================*)
- (* Convert time to LONGINT from Turbo's structure *)
- (*===========================================================================*)
-
- PROCEDURE convert_time(in_s : DATETIME; VAR out_t : LONGINT);
- VAR
- i : WORD;
- j : WORD;
- t : LONGINT;
- BEGIN;
-
- i := in_s.sec SHR secs_per_tick_shift + WORD(in_s.hour) * ticks_per_hour
- + WORD(in_s.min) * ticks_per_min;
- t := LONGINT(i) + LONGINT(ticks_per_day) * (in_s.day - 1);
-
- i := in_s.year;
- IF i > 1900 THEN
- i := i - 1981
- ELSE
- i := i - 81;
-
- j := i AND 3;
- i := i SHR 2;
-
- IF j <> 3 THEN
- j := 365 * j + y_noleap[in_s.month]
- ELSE
- j := 365 * j + y_leap[in_s.month];
-
- out_t := t + ticks_per_day * (LONGINT(j) + days_per_4year * i);
- END;
-
- (*===========================================================================*)
- (* Calculate a new date/time string *)
- (*===========================================================================*)
-
- PROCEDURE new_date;
- BEGIN;
-
- GETDATE(today_time.year, today_time.month, today_time.day, todays_dow);
- convert_time(today_time, current_day_time);
-
- STR(today_time.year:4, work_str);
- todays_date_time := SUBSTR(work_str, 3, 2);
-
- STR(today_time.month:2, work_str);
- IF work_str[1] = ' ' THEN work_str[1] := '0';
- todays_date_time := todays_date_time + work_str;
-
- STR(today_time.day:2, work_str);
- IF work_str[1] = ' ' THEN work_str[1] := '0';
- todays_date_time := todays_date_time + work_str + '/';
-
- new_time;
-
- last_midnight := current_day_time
- - (current_day_time MOD ticks_per_day);
-
- END;
-
- (*===========================================================================*)
- (* Calculate a new time string *)
- (*===========================================================================*)
-
- PROCEDURE new_time;
- BEGIN;
-
- todays_date_time[0] := CHR(7);
-
- STR(today_time.hour:2, work_str);
- IF work_str[1] = ' ' THEN work_str[1] := '0';
- todays_date_time := todays_date_time + work_str;
-
- STR(today_time.min:2, work_str);
- IF work_str[1] = ' ' THEN work_str[1] := '0';
- todays_date_time := todays_date_time + work_str;
-
- END;
-
- (*===========================================================================*)
- (* Subroutine that reads the clock and verifies the date time stamp *)
- (*===========================================================================*)
-
- PROCEDURE time_check;
-
- BEGIN;
-
- GETTIME(today_time.hour, today_time.min, today_time.sec, sec100);
-
- get_up_time;
-
- convert_time(today_time, current_day_time);
-
- IF today_time.min = last_min THEN
- EXIT;
-
- status_window_change := opt_block.opt_time_status;
-
- last_min := today_time.min;
-
- IF today_time.hour <> last_hours THEN
- BEGIN;
- new_date;
- last_hours := today_time.hour;
- END
- ELSE
- new_time;
-
- END;
-
- (*===========================================================================*)
- (* Convert a date/time stamp to characters *)
- (*===========================================================================*)
-
- FUNCTION time_str(in_time : LONGINT; year_sw : BOOLEAN) : STRING;
-
- VAR
- i : BYTE;
- t_str : STRING;
- t_time : DATETIME;
-
- BEGIN;
-
- (*-----------------------------------------------------------------------*)
- (* Break time into pieces. *)
- (*-----------------------------------------------------------------------*)
-
- unconvert_time(in_time, t_time);
-
- (*-----------------------------------------------------------------------*)
- (* If year wanted, add it *)
- (*-----------------------------------------------------------------------*)
-
- IF year_sw THEN
- BEGIN;
- STR(t_time.year:2, work_str);
- t_str[0] := CHR(2);
- IF t_time.year > 99 THEN
- i := 3
- ELSE
- i := 1;
- t_str[1] := work_str[i];
- t_str[2] := work_str[i+1];
- END
- ELSE
- t_str := '';
-
- (*-----------------------------------------------------------------------*)
- (* Convert the rest *)
- (*-----------------------------------------------------------------------*)
-
- STR(t_time.month:2, work_str);
- IF work_str[1] = ' ' THEN work_str[1] := '0';
- t_str := t_str + work_str;
-
- STR(t_time.day:2, work_str);
- IF work_str[1] = ' ' THEN work_str[1] := '0';
- t_str := t_str + work_str + '/';
-
- STR(t_time.hour:2, work_str);
- IF work_str[1] = ' ' THEN work_str[1] := '0';
- t_str := t_str + work_str;
-
- STR(t_time.min:2, work_str);
- IF work_str[1] = ' ' THEN work_str[1] := '0';
- time_str := t_str + work_str;
-
- END;
-
- (*===========================================================================*)
- (* Convert characters to a date time stamp *)
- (*===========================================================================*)
-
- FUNCTION time_unstr(in_time : STRING; VAR err : BOOLEAN) : LONGINT;
-
- VAR
- code : INTEGER;
- i : BYTE;
- j : INTEGER;
- nz : BOOLEAN;
- t_str : STRING[4];
- t_time : DATETIME;
- w_time : LONGINT;
-
- FUNCTION cvt : WORD;
- BEGIN;
- IF i = LENGTH(in_time) THEN
- BEGIN;
- cvt := 0;
- err := TRUE;
- EXIT;
- END;
-
- IF i > LENGTH(in_time) THEN
- BEGIN;
- cvt := 0;
- EXIT;
- END;
-
- VAL(substr(in_time, i, 2), j, code);
- err := (code <> 0) OR ((j = 0) AND nz);
- cvt := j;
- i := i + 2;
-
- END;
-
- BEGIN;
-
- strip_var(in_time, 'B');
-
- WITH t_time DO
- BEGIN;
-
- err := TRUE;
- nz := TRUE;
-
- IF in_time[1] = '1' THEN
- BEGIN;
- IF LENGTH(in_time) < 4 THEN EXIT;
- t_str := substr(in_time, 1, 4);
- in_time := substr(in_time, 5, 0);
- END
- ELSE
- BEGIN
- IF LENGTH(in_time) < 2 THEN EXIT;
- t_str := substr(in_time, 1, 2);
- in_time := substr(in_time, 3, 0);
- END;
-
- VAL(t_str, year, code);
- IF code <> 0 THEN EXIT;
-
- i := 1;
-
- month := cvt;
- IF month > 12 THEN
- err := TRUE;
- IF err THEN EXIT;
-
- day := cvt;
- IF day > 31 THEN
- err := TRUE;
- IF err THEN EXIT;
-
- IF in_time[i] = '/' THEN
- INC(i);
-
- nz := FALSE;
-
- hour := cvt;
- IF hour > 23 THEN
- err := TRUE;
- IF err THEN EXIT;
-
- min := cvt;
- IF min > 59 THEN
- err := TRUE;
- IF err THEN EXIT;
-
- sec := 0;
-
- END;
-
- convert_time(t_time, w_time);
-
- time_unstr := w_time;
-
- END;
-
- (*===========================================================================*)
- (* Add a certain number of seconds onto current time *)
- (*===========================================================================*)
-
- FUNCTION time_from_now (secs : WORD) : LONGINT;
- BEGIN;
-
- IF secs < secs_per_tick THEN
- secs := secs_per_tick;
-
- secs := secs SHR secs_per_tick_shift;
-
- time_from_now := current_day_time + secs;
-
- END;
-
- (*===========================================================================*)
- (* Given a number of minutes past the hour, find the next time that occurs *)
- (*===========================================================================*)
-
- FUNCTION time_next_hour(min_hour: WORD) : LONGINT;
-
- VAR
- t_offset : WORD;
- t_time : DATETIME;
- t_time_int : LONGINT;
-
-
- BEGIN;
-
- (*-----------------------------------------------------------------------*)
- (* Put time in work area *)
- (*-----------------------------------------------------------------------*)
-
- t_time := today_time;
-
- (*-----------------------------------------------------------------------*)
- (* Calculate the time at the last hour mark *)
- (*-----------------------------------------------------------------------*)
-
- t_time.min := 0;
- t_time.sec := 0;
-
- convert_time(t_time, t_time_int);
-
- (*-----------------------------------------------------------------------*)
- (* Calculate offset from the hour mark for the time we want *)
- (*-----------------------------------------------------------------------*)
-
- t_offset := min_hour * ticks_per_min;
-
- (*-----------------------------------------------------------------------*)
- (* Now figure out the time this hour for the time we want *)
- (*-----------------------------------------------------------------------*)
-
- t_time_int := t_time_int + t_offset;
-
- (*-----------------------------------------------------------------------*)
- (* If that time is already past, add an hour *)
- (*-----------------------------------------------------------------------*)
-
- IF t_time_int <= current_day_time THEN
- t_time_int := t_time_int + ticks_per_hour;
-
- (*-----------------------------------------------------------------------*)
- (* Set result *)
- (*-----------------------------------------------------------------------*)
-
- time_next_hour := t_time_int;
-
- END;
-
- (*===========================================================================*)
- (* Calculate the up time *)
- (*===========================================================================*)
-
- PROCEDURE get_up_time;
-
- VAR
- new_up_time : LONGINT;
-
- BEGIN;
-
- new_up_time := sec100 + LONGINT(today_time.sec) * up_ticks_per_sec
- + LONGINT(today_time.min) * up_ticks_per_min
- + LONGINT(today_time.hour) * up_ticks_per_hour
- + LONGINT(up_days) * up_ticks_per_day;
-
- IF new_up_time < up_time THEN
- BEGIN
- INC(up_days);
- new_up_time := new_up_time + up_ticks_per_day;
- END;
-
- up_time := new_up_time;
-
- END;
-
- (*===========================================================================*)
- (* Get up time now *)
- (*===========================================================================*)
-
- PROCEDURE calc_up_time;
-
- BEGIN;
-
- GETTIME(today_time.hour, today_time.min, today_time.sec, sec100);
-
- get_up_time;
-
- END;
-
- (*===========================================================================*)
- (* Add a certain number of seconds onto current up time *)
- (*===========================================================================*)
-
- FUNCTION up_time_from_now (secs : WORD) : LONGINT;
- BEGIN;
-
- up_time_from_now := up_time + secs * LONGINT(up_ticks_per_sec);
-
- END;
-
- END.